package br.com.financeiro.dao;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import br.com.financeiro.helpers.DataBaseHelper;
import br.com.financeiro.model.Conta;
import br.com.financeiro.model.TipoConta;

public class ContaDao {

	public static final String NOME_TABELA = "conta";
    public static final String COLUNA_ID = "id";
    public static final String COLUNA_TIPO_CONTA = "tipo_conta";
    public static final String COLUNA_DESCRICAO = "descricao";
    public static final String COLUNA_DATA = "data";
    public static final String COLUNA_OBSERVACAO = "observacao";
    public static final String COLUNA_VALOR = "valor";
    public TipoContaDao tipoContaDao;
 
    public static final String SCRIPT_CRIACAO_TABELA_CONTA = "CREATE TABLE " + NOME_TABELA + "("
            + COLUNA_ID + " INTEGER PRIMARY KEY ," + COLUNA_TIPO_CONTA + " INTEGER,"+ COLUNA_DESCRICAO + " TEXT," +
    		COLUNA_DATA +" TEXT,"+ COLUNA_OBSERVACAO + " TEXT," + COLUNA_VALOR +" DOUBLE" +")";
 
    public static final String SCRIPT_DELECAO_TABELA =  "DROP TABLE IF EXISTS " + NOME_TABELA;
 
 
    private SQLiteDatabase dataBase = null; 
 
    private static ContaDao instance;
     
    public static ContaDao getInstance(Context context) {
        if(instance == null)
            instance = new ContaDao(context);
        return instance;
    }
 
    private ContaDao(Context context) {
        DataBaseHelper dataBaseHelper = DataBaseHelper.getInstance(context);
        dataBase = dataBaseHelper.getWritableDatabase();
        tipoContaDao = TipoContaDao.getInstance(context);
    }
 
    public void salvar(Conta conta) {
        ContentValues values = gerarContentValeuesConta(conta);
        dataBase.insert(NOME_TABELA, null, values);
    }
 
    public List<Conta> recuperarTodos() {
        String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
        Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
        List<Conta> contas = construirContaPorCursor(cursor);
 
        return contas;
    }
    
    public Conta recuperarPelaPosicao(int posicao) {
    	  String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
          Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
          List<Conta> contas = construirContaPorCursor(cursor);
   
          return contas.get(posicao);
    }
    
    public List<Conta> recuperarPeloPeriodo(Date dataInicio, Date dataFinal){
   	 String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
        Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
        List<Conta> contas = construirContaPorCursor(cursor);
        List<Conta> remover = new ArrayList<Conta>();
        for (Conta conta : contas) {
			if(  (dataInicio.before(conta.getData()) || dataInicio.equals(conta.getData())) && (dataFinal.after(conta.getData()) || dataFinal.equals(conta.getData()))){
				
			}else{
				remover.add(conta);
			}
		}
       for (Conta conta : remover) {
			contas.remove(conta);
		}
        return contas;
   }
    
    public List<Conta> recuperarReceitasPeloPeriodo(Date dataInicio, Date dataFinal){
    	 String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
         Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
         List<Conta> contas = construirContaPorCursor(cursor);
         List<Conta> remover = new ArrayList<Conta>();
         for (Conta conta : contas) {
			if(  (dataInicio.before(conta.getData()) || dataInicio.equals(conta.getData())) && (dataFinal.after(conta.getData()) || dataFinal.equals(conta.getData()))){
				if(conta.getTipo().getDespesa() == 1){
					remover.add(conta);
				}
			}else{
				remover.add(conta);
			}
		}
        for (Conta conta : remover) {
			contas.remove(conta);
		}
         return contas;
    }
 
    public List<Conta> recuperarDespesasPeloPeriodo(Date dataInicio, Date dataFinal){
   	 String queryReturnAll = "SELECT * FROM " + NOME_TABELA;
        Cursor cursor = dataBase.rawQuery(queryReturnAll, null);
        List<Conta> contas = construirContaPorCursor(cursor);
        List<Conta> remover = new ArrayList<Conta>();
        for (Conta conta : contas) {
			if(  (dataInicio.before(conta.getData()) || dataInicio.equals(conta.getData())) && (dataFinal.after(conta.getData()) || dataFinal.equals(conta.getData()))){
				if(conta.getTipo().getDespesa() != 1){
					remover.add(conta);
				}
			}else{
				remover.add(conta);
			}
		}
        for (Conta conta : remover) {
			contas.remove(conta);
		}
        
        return contas;
   }
    
    public double calcularValor(List<Conta> contas){
    	double valor = 0.0;
    	for (Conta conta : contas) {
			valor += conta.getValor();
		}
    	return valor;
    }
    
    
    public void deletar(Conta conta) {
 
        String[] valoresParaSubstituir = {
                String.valueOf(conta.getId())
        };
 
        dataBase.delete(NOME_TABELA, COLUNA_ID + " =  ?", valoresParaSubstituir);
    }
 
    public void editar(Conta conta) {
        ContentValues valores = gerarContentValeuesConta(conta);
 
        String[] valoresParaSubstituir = {
                String.valueOf(conta.getId())
        };
 
        dataBase.update(NOME_TABELA, valores, COLUNA_ID + " = ?", valoresParaSubstituir);
    }
 
    public void fecharConexao() {
        if(dataBase != null && dataBase.isOpen())
            dataBase.close(); 
    }
 
 
    private List<Conta> construirContaPorCursor(Cursor cursor) {
        List<Conta> contas = new ArrayList<Conta>();
        DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
        if(cursor == null)
            return contas;
         
        try {
 
            if (cursor.moveToFirst()) {
                do {
 
                    int indexID = cursor.getColumnIndex(COLUNA_ID);
                    int indexTipoConta = cursor.getColumnIndex(COLUNA_TIPO_CONTA);
                    int indexDescricao = cursor.getColumnIndex(COLUNA_DESCRICAO);
                    int indexData = cursor.getColumnIndex(COLUNA_DATA);
                    int indexObservacao = cursor.getColumnIndex(COLUNA_OBSERVACAO);
                    int indexValor = cursor.getColumnIndex(COLUNA_VALOR);
                    
                    int id = cursor.getInt(indexID);
                    TipoConta tipoConta = (TipoConta) tipoContaDao.recuperarPeloId(cursor.getInt(indexTipoConta));
                    String descricao = cursor.getString(indexDescricao);
                    String dataString = cursor.getString(indexData);
                    String observacao = cursor.getString(indexObservacao);
                    Double valor = cursor.getDouble(indexValor);
 
                    Conta conta = new Conta();
                    conta.setId(id);
                    conta.setTipo(tipoConta);
                    conta.setDescricao(descricao);
                    Date dataConvertida = null;
                    try{
                     dataConvertida = new Date(format.parse(dataString).getTime());
                    }catch (Exception e) {
						// TODO: handle exception
					}
                    conta.setData(dataConvertida);
                    conta.setObservacao(observacao);
                    conta.setValor(valor);
                    contas.add(conta);
 
                } while (cursor.moveToNext());
            }
             
        } finally {
            cursor.close();
        }
        return contas;
    }
 
    private ContentValues gerarContentValeuesConta(Conta conta) {
    	DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    	String data = format.format(conta.getData());
        ContentValues values = new ContentValues();
        values.put(COLUNA_TIPO_CONTA, conta.getTipo().getId());
        values.put(COLUNA_DESCRICAO, conta.getDescricao());
        values.put(COLUNA_DATA, data);
        values.put(COLUNA_OBSERVACAO, conta.getObservacao());
        values.put(COLUNA_VALOR, conta.getValor());
        return values;
    }
}
